home *** CD-ROM | disk | FTP | other *** search
/ PCMania 43 / PCMania CD43_1.nrg / midi / midiio.hpp < prev    next >
C/C++ Source or Header  |  1995-06-05  |  6KB  |  200 lines

  1. #ifndef __MIDIIO__
  2. #define __MIDIIO__
  3.  
  4. #include <stdio.h>
  5.  
  6. #ifndef MIDI_BUFSIZE
  7. #define MIDI_BUFSIZE  1024
  8. #endif
  9.  
  10. const unsigned long MThd = 0x4D546864ul;
  11. const unsigned long MTrk = 0x4D54726Bul;
  12.  
  13. #define OPTION_NOCONTROLS   1
  14. #define OPTION_NOEVENTS     2
  15.  
  16. #define NOCHANNEL     (-1)
  17. #define MULTICHANNEL  (-2)
  18.  
  19. // for use of param what in function text()
  20. #define meta_text       1
  21. #define meta_copyright  2
  22. #define meta_trackname  3
  23. #define meta_instrument 4
  24. #define meta_lyric    5
  25. #define meta_marker    6
  26. #define meta_cuepoint    7
  27.  
  28. class MidiRead
  29. {
  30. public:
  31.   MidiRead(const char* filename);
  32.   ~MidiRead();
  33.  
  34.   int run();
  35.   int runhead();
  36.   int runtrack(int trackno);
  37.  
  38.   long getpos() { return pos_; }
  39.  
  40.   virtual void head(unsigned songs, unsigned tracks, unsigned clicksperquarter);
  41.   virtual void track(int trackno, unsigned length, int channel);
  42.   virtual void endtrack(int trackno);
  43.  
  44.   virtual void seqnumber(unsigned int seqno);
  45.   virtual void text(int what, int len, char* whattext, unsigned char* txt);
  46.   virtual void meta(int what, int len, unsigned char* data);
  47.   virtual void end();
  48.   virtual void smpteofs(int hour, int min, int sec, int frame, int fracframe);
  49.   virtual void tact(int nom, int denom, int clicksperbeat, int notes32perbeat);
  50.   virtual void tempo(unsigned long ticks);
  51.   virtual void key(int signature, int isminor); // C=0, -7=7flats +7=7sharps
  52.   virtual void program(int channel, int prg);
  53.   virtual void control(int channel, int what, int val);
  54.   virtual void highbank(int channel, int val);
  55.   virtual void wheel(int channel, int val);
  56.   virtual void breath(int channel, int val);
  57.   virtual void foot(int channel, int val);
  58.   virtual void portamentotime(int channel, int val);
  59.   virtual void data(int channel, int val);
  60.   virtual void volume(int channel, int val);
  61.   virtual void balance(int channel, int val);
  62.   virtual void expression(int channel, int val);
  63.   virtual void lowbank(int channel, int val);
  64.   virtual void hold(int channel, int val);
  65.   virtual void reverb(int channel, int val);
  66.   virtual void chorus(int channel, int val);
  67.   virtual void datainc(int channel, int val);
  68.   virtual void datadec(int channel, int val);
  69.   virtual void noteon(int channel, int note, int vel);
  70.   virtual void noteoff(int channel, int note, int vel);
  71.   virtual void time(unsigned long ticks);
  72.   virtual void pitchbend(int channel, int val);
  73.   virtual void polyaftertouch(int channel, int note, int val);
  74.   virtual void aftertouch(int channel, int val);
  75.   virtual void songpos(unsigned pos);
  76.   virtual void songselect(unsigned char song);
  77.   virtual void tunerequest();
  78.   virtual void timingclock();
  79.   virtual void start();
  80.   virtual void cont();
  81.   virtual void stop();
  82.   virtual void activesense();
  83.   virtual void sysex(int syslen, unsigned char* sysdata);
  84.   virtual void endmidi();
  85.   virtual void error(const char* msg);
  86.  
  87.   virtual void percent(int perc);
  88.  
  89.   int getchannel() { return curchannel_; }
  90.   void setchannel(int channel);
  91.  
  92.   static const char* progname(int n, int channel);
  93.   static const char* notename(unsigned char note);
  94.  
  95.   int options_;
  96.  
  97.   int songs_, tracks_, clicks_;
  98.  
  99. protected:
  100.   const char *midiname_;
  101.   FILE* f_;
  102.   long filesize_;
  103.   unsigned char buf_[MIDI_BUFSIZE];
  104.   int buflen_, bufpos_;
  105.   int curchannel_;
  106.   int percent_;
  107.  
  108.  
  109.   long pos_, curpos_;
  110.  
  111.   unsigned char* need(int nbytes);
  112.  
  113.   int getbyte();
  114.   unsigned getword();
  115.   unsigned long gettri();
  116.   unsigned long getlong();
  117.   unsigned long getdelta();
  118.   unsigned char* get(int len);
  119.   void seek(long pos);
  120.  
  121.   int scanchannel(unsigned long maxlen); // channel 0-15 or -1=no channel or -2=multichannels
  122.   int scansysevent(unsigned long maxlen);
  123. };
  124.  
  125. class MidiWrite
  126. {
  127. public:
  128.   MidiWrite(const char* filename);
  129.   ~MidiWrite();
  130.  
  131.   void head(unsigned clicksperquarter = 192);
  132.   void track();
  133.   void endtrack();
  134.  
  135.   void event(int what, int len, unsigned char* data);
  136.  
  137.   void text(int what, int len, unsigned char* txt);
  138.   void meta(int what, int len, unsigned char* data); // 0xff ....
  139.   void end();
  140.   void tact(int nom, int denom, int v1, int v2);
  141.   void tempo(unsigned long ticks);
  142.   void program(int channel, int prg);
  143.   void control(int channel, int what, int val);
  144.   void highbank(int channel, int val);
  145.   void wheel(int channel, int val);
  146.   void breath(int channel, int val);
  147.   void foot(int channel, int val);
  148.   void portamentotime(int channel, int val);
  149.   void data(int channel, int val);
  150.   void volume(int channel, int val);
  151.   void balance(int channel, int val);
  152.   void expression(int channel, int val);
  153.   void lowbank(int channel, int val);
  154.   void hold(int channel, int val);
  155.   void reverb(int channel, int val);
  156.   void chorus(int channel, int val);
  157.   void datainc(int channel, int val);
  158.   void datadec(int channel, int val);
  159.   void noteon(int channel, int note, int vel);
  160.   void noteoff(int channel, int note, int vel);
  161.   void time(unsigned long ticks);
  162.   void pitchbend(int channel, int val);
  163.   void polyaftertouch(int channel, int note, int val);
  164.   void aftertouch(int channel, int val);
  165.   void songpos(unsigned pos);
  166.   void songselect(unsigned char song);
  167.   void tunerequest();
  168.   void timingclock();
  169.   void start();
  170.   void cont();
  171.   void stop();
  172.   void activesense();
  173.   void sysex(int syslen, unsigned char* sysdata);
  174.  
  175.   void putbyte(unsigned char val);
  176.   void putcode(unsigned char code);
  177.   void putword(unsigned val);
  178.   void puttri(unsigned long val);
  179.   void putlong(unsigned long val);
  180.   void putdelta(unsigned long val);
  181.   void puttime();
  182.   void put(int len, unsigned char* c);
  183.   void seek(long pos);
  184.  
  185. protected:
  186.   const char *midiname_;
  187.   FILE* f_;
  188.   long trackpos_, curpos_, filesize_;
  189.   int trackchannel_, trackcount_, lastcode_, endtrack_;
  190.  
  191.   unsigned char buf_[MIDI_BUFSIZE];
  192.   int bufpos_, buflen_;
  193.  
  194.   unsigned long curdelta_;
  195.  
  196.   void flush();
  197. };
  198.  
  199. #endif
  200.